#include <bits/stdc++.h>
using namespace std;

class Solution
{
  public:
    // 检查给定的字符串是否为有效的括号组合
    bool isValid(string s)
    {
        // write code here
        int length = s.size();
        // 如果字符串长度为奇数，则不可能是有效的括号组合
        if (length % 2)
            return false;
        stack<char> st;
        // 遍历字符串中的每个字符
        for (char c : s)
        {
            // 如果字符是左括号之一，则将其对应的右括号压入栈中
            if (mp.find(c) != mp.end())
            {
                st.push(mp[c]);
            }
            else
            {
                // 如果字符是右括号，但栈为空或栈顶元素不是该右括号，则字符串无效
                if (st.empty() || st.top() != c)
                {
                    return false;
                }
                // 弹出栈顶元素，匹配当前右括号
                st.pop();
            }
        }
        // 如果栈为空，则所有括号都已匹配，字符串有效
        return st.empty();
    }

  private:
    // 存储左括号和右括号的映射关系
    unordered_map<char, char> mp = {{'(', ')'}, {'[', ']'}, {'{', '}'}};
};